#include <sdkconfig.h>
#include <string.h>
#include <esp_log.h>

#include "app_reset.h"
#include "app_priv.h"
#include "driver/gpio.h"

// 定义按钮GPIO引脚和按钮的有效电平（低电平）
#define BUTTON_GPIO          CONFIG_BOARD_GPIO_BOOT
#define BUTTON_ACTIVE_LEVEL  0

// 定义控制LED和RELAY的GPIO引脚
#define OUTPUT_GPIO_LED   CONFIG_EXAMPLE_OUTPUT_GPIO_10
#define OUTPUT_GPIO_RELAY CONFIG_EXAMPLE_OUTPUT_GPIO_8

// 定义Wi-Fi重置和恢复出厂设置按钮的超时时间（单位：秒）
#define WIFI_RESET_BUTTON_TIMEOUT       3
#define FACTORY_RESET_BUTTON_TIMEOUT    10

// 设置GPIO输出
esp_err_t app_driver_set_gpio(const char *name, bool state)
{
    if (strcmp(name, "Led") == 0) {
        gpio_set_level(OUTPUT_GPIO_LED, !state);  // 控制LED
    } else if (strcmp(name, "Relay") == 0) {
        gpio_set_level(OUTPUT_GPIO_RELAY, state);  // 控制继电器
    }  else {
        return ESP_FAIL;  // 如果名称不匹配，返回错误
    }
    return ESP_OK;  // 成功设置GPIO
}

// 初始化GPIO和按钮
void app_driver_init()
{
    // 注册重置按钮功能，并设置Wi-Fi重置和工厂重置超时时间
    app_reset_button_register(app_reset_button_create(BUTTON_GPIO, BUTTON_ACTIVE_LEVEL),
                WIFI_RESET_BUTTON_TIMEOUT, FACTORY_RESET_BUTTON_TIMEOUT);
    // 配置GPIO引脚用于输出
    gpio_config_t io_conf = {
        .mode = GPIO_MODE_OUTPUT,  // 设置为输出模式
    };
    uint64_t pin_mask = (((uint64_t)1 << OUTPUT_GPIO_LED ) | ((uint64_t)1 << OUTPUT_GPIO_RELAY ));
    io_conf.pin_bit_mask = pin_mask;  // 设置GPIO掩码
    gpio_config(&io_conf);  // 配置GPIO
    gpio_set_level(OUTPUT_GPIO_LED, true);  // 设置LED为打开状态关闭状态
    gpio_set_level(OUTPUT_GPIO_RELAY, false);  // 设置继电器为关闭状态
}
